// utils/request.js
import { showLoading, hideLoading } from '@/utils/jzloading' // 自定义 loading 提示

// 基础配置
const baseConfig = {
  baseURL: process.env.NODE_ENV === 'development' 
    ? '/api' // 开发环境使用代理
    : 'https://api.awarelife.cn',    // 生产环境
  timeout: 10000,
  header: {
    'Content-Type': 'application/json'
  }
}

// 请求拦截器
const requestInterceptor = (config) => {
  // 显示 loading（可选）
  showLoading()
  
  // 添加 token（如果有）
  const token = uni.getStorageSync('token')
  if (token) {
    config.header['jz-x-token'] = `${token}`
  }
  
  return config
}

// 响应拦截器
const responseInterceptor = (response) => {
  // 隐藏 loading
  hideLoading()
  console.log(response)
  // 统一处理响应状态码
  const { data } = response
  if (data.code === 1) {
    return data.data // 成功返回数据
  } else if (data.code === -1) {
    // 未登录或 token 过期，跳转到登录页
    uni.removeStorageSync('token')
    uni.removeStorageSync('userInfo')
    uni.navigateTo({ url: '/pages/login/login' })
    return Promise.reject(new Error('未登录'))
  } else if (data.code === -101) {
    // 未注册，跳转到注册页
    uni.removeStorageSync('token')
    uni.removeStorageSync('userInfo')
    uni.navigateTo({ url: '/pages/login/login' })
    return Promise.reject(new Error('未注册'))
  } else {
    // 其他错误，显示错误信息
    uni.showToast({
      title: data.msg || '请求失败',
      icon: 'none'
    })
    return Promise.reject(new Error(data.msg || '请求失败'))
  }
}

// 错误处理
const errorHandler = (error) => {
  hideLoading()
  uni.showToast({
    title: '网络连接失败',
    icon: 'none'
  })
  return Promise.reject(error)
}

// 封装请求方法
export const request = (options) => {
  // 合并配置
  const config = {
    ...baseConfig,
    ...options,
    url: options.url.startsWith('/') 
      ? baseConfig.baseURL + options.url 
      : options.url
  }
  
  // 请求拦截
  const interceptedConfig = requestInterceptor(config)
  
  // 返回 Promise
  return new Promise((resolve, reject) => {
    uni.request({
      ...interceptedConfig,
      success: (res) => {
        try {
          const result = responseInterceptor(res)
          resolve(result)
        } catch (error) {
          reject(error)
        }
      },
      fail: (err) => {
        errorHandler(err)
        reject(err)
      }
    })
  })
}

// 常用请求方法封装
export const get = (url, params = {}) => request({ url, method: 'GET', data: params })
export const post = (url, data = {}) => request({ url, method: 'POST', data })
export const put = (url, data = {}) => request({ url, method: 'PUT', data })
export const del = (url, params = {}) => request({ url, method: 'DELETE', data: params })